﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	printf("%d\n", a);
//	return 0;
//}

//int main()
//{
//    int a = 10000;
//    FILE* pf = fopen("test.txt", "wb");
//    fwrite(&a, 4, 1, pf);//二进制的形式写到文件中    
//    fclose(pf);
//    pf = NULL;
//    return 0;
//}

//int main()
//{
//	//. 表示当前路径
//	//.. 表示上一级路径
//	//FILE* pf = fopen("data.txt", "w");
//	//这里的路径是相对路径，表示在当前工程目录下的data.txt
//	FILE* pf = fopen("D:\\app\cangku\\c-language-learning\\take_to_the_road25\\take_to_the_road25\\data.txt", "w");
//	//绝对路径写法
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	fputc('a', pf);
//	fputc('b', pf);
//	fputc('c', pf);
//	fputc('d', pf);
//	fputc('e', pf);
//	//关文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//写字符到标准输出流（屏幕）
//	fputc('a', stdout);
//	fputc('b', stdout);
//	fputc('c', stdout);
//	fputc('d', stdout);
//	fputc('e', stdout);
// 
// putchar('a');//等价于这个
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	int i = 0;
//	for (i = 'a'; i <= 'z'; i++)
//	{
//		fputc(i, pf);
//	}
//	//关文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int ch = fgetc(pf);
//	printf("%c\n", ch);
//	putchar(ch);
//	fputc(ch, stdout);
//	//关文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		int ch = fgetc(pf);
//		fputc(ch, stdout);
//	}
//	//关文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//从键盘读取数据
//int main()
//{
//	int i = 0;
//	int ch = fgetc(stdin);
//	fputc(ch, stdout);
//
//	return 0;
//}

//假设data.txt文件中存放abcdef
//int main()
//{
//    FILE* fp = fopen("data.txt", "r");
//    if (fp == NULL)
//    { 
//        perror("fopen\n");
//        return 1;
//    }
//    int i = 0;
//    for (i = 0; i < 10; i++)
//    {
//        int c = fgetc(fp);
//        if (c == EOF)
//        {
//            if (feof(fp))
//                printf("遇到文件末尾了\n");
//            else if (ferror(fp))
//                printf("读取发生了错误\n");
//        }
//        else
//        {
//            fputc(c, stdout); //使用fputc在标准输出流上打印字符
//        }
//    }
//    //不再使用文件时，需要关闭文件
//    fclose(fp);
//    fp = NULL; //将指针置为NULL,避免成为野指针。
//    return 0;
//}

//以写的形式打开文件后，再去读文件，就会发生错误
//int main()
//{
//    FILE* fp = fopen("data.txt", "w");
//    if (fp == NULL)
//    {
//        perror("fopen\n");
//        return 1;
//    }
//    int c = fgetc(fp);//读文件
//    if (c == EOF)
//    {
//        if (feof(fp))
//            printf("遇到文件末尾了\n");
//        else if (ferror(fp))
//        {
//            printf("读文件发生了错误\n");
//        }
//    }
//    else
//    {
//        fputc(c, stdout); //使用fputc在标准输出流上打印字符
//    }
//
//    //不再使用文件时，需要关闭文件
//    fclose(fp);
//    fp = NULL; //将指针置为NULL,避免成为野指针。
//    return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	fputs("asd\0sfdsf", pf);
//	fputs("jkl", pf);
//	//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
// 
//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	char arr[20] = "xxxxxxxxxxxxxxxx";
//	fgets(arr, 10, pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct Stu
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct Stu s = { "zhangsan", 20, 85.5f };
//
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	//fprintf(pf, "%s %d %f\n", s.name, s.age, s.score);
//	fprintf(stdout, "%s %d %f\n", s.name, s.age, s.score);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//struct Stu
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct Stu s = { 0 };
//
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int r = fscanf(pf,"%s %d %f", s.name, &(s.age), &(s.score));
//	printf("%s %d %f\n", s.name, s.age, s.score);
//	printf("r = %d\n", r);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "zhangsan", 20, 95.5 };
//	FILE*pf = fopen("data.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	fwrite(&s, sizeof(struct S), 1, pf);
//	//关
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//int main()
//{
//    int data[] = { 1, 2, 3, 4, 5 };
//    // 打开文件
//    FILE* fp = fopen("data.txt", "wb");
//    // 检查文件是否成功打开
//    if (fp == NULL) 
//    {
//        perror("fopen");
//        return -1;
//    }
//    // 将数据写入文件
//    if (fwrite(data, sizeof(int), 5, fp) != 5) 
//    {
//        perror("fwrite");
//        return -1;
//    }
//    // 关闭文件
//    fclose(fp);
//    fp = NULL;
//    return 0;
//}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { 0 };
//	FILE*pf = fopen("data.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	fread(&s, sizeof(struct S), 1, pf);
//	printf("%s %d %f\n", s.name, s.age, s.score);
//	//关
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = {0};
//	FILE* pf = fopen("data.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	size_t r = fread(&s, sizeof(struct S), 1, pf);
//	if (r != 1)
//	{
//		//1. 遇到了文件末尾
//		if (feof(pf))
//		{
//			printf("遇到了文件末尾\n");
//		}
//		//2. 读取发生了错误
//		else if (ferror(pf))
//		{
//			printf("读取过程中发生了错误\n");
//		}
//	}
//	else 
//	{
//		printf("%s %d %f\n", s.name, s.age, s.score);
//	}
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct Stu
//{
//	char name[30];
//	int age;
//	float score;
//};
//int main()
//{
//	struct Stu s = { "zhangsan", 100, 85.5f };
//	//将s中的结构数据转换成⼀个字符串
//	char arr[100] = { 0 };
//	sprintf(arr, "%s %d %.1f", s.name, s.age, s.score);
//	printf("%s\n", arr);
//	return 0;
//}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct S s = { "zhangsan", 20, 95.5f };
//	char buf[100] = { 0 };
//	sprintf(buf, "%s %f %d", s.name, s.score, s.age);//"zhangsan 95.500000 20"
//	printf("%s\n", buf);//打印字符串的内容
//
//	struct S t = {0};
//	sscanf(buf, "%s %f %d", t.name, &(t.score), &(t.age));
//	printf("%s %d %f\n", t.name, t.age, t.score);//结构体的数据
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int ch = fgetc(pf);//a
//
//	fseek(pf, 6, SEEK_SET);
//	fseek(pf, 5, SEEK_CUR);
//	fseek(pf, -3, SEEK_END);
//	printf("%c\n", ch);
//
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fputs("abcdefghi", pf);
//	//写文件
//	fseek(pf, -3, SEEK_END);
//	fputc('x', pf);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fputs("abcdefghi", pf);
//	//写文件
//	fseek(pf, -3, SEEK_END);
//	fputc('x', pf);
//
//	int ret = ftell(pf);
//	printf("%d\n", ret);//7
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fputs("abcdefghi", pf);
//	//写文件
//	fseek(pf, -3, SEEK_END);
//	fputc('x', pf);
//
//	fseek(pf, 0, SEEK_END);
//	int ret = ftell(pf);
//	printf("文件的字节数:%d\n", ret);
//	rewind(pf);//文件指针就回到文件的起始位置了
//	//等价于fseek(pf, 0, SEEK_SET);
//	fputc('q', pf);
//
//
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

#include <windows.h>
////VS2022 WIN11环境测试
//
//int main()
//{
//    FILE* pf = fopen("text.txt", "w");
//    fputs("abcdef", pf);//先将代码放在输出缓冲区
//    printf("睡眠10秒-已经写数据了，打开test.txt文件，发现文件没有内容\n");
//    Sleep(10000);
//    printf("刷新缓冲区\n");
//    fflush(pf);//刷新缓冲区时，才将输出缓冲区的数据写到文件（磁盘）
//    //注：fflush 在高版本的VS上不能使用了
//    printf("再睡眠10秒-此时，再次打开test.txt文件，文件有内容了\n");
//    Sleep(10000);
//    fclose(pf);
//    //注：fclose在关闭文件的时候，也会刷新缓冲区
//    pf = NULL;
//
//    return 0;
//}

int main()
{
	FILE* fp = fopen("data.txt", "w+");
	if (fp == NULL)
	{
		perror("fopen for w+");
		return 1;
	}
	//写abcdefghi到⽂件中
	fputs("abcdefghi", fp);
	//刷新缓冲区，保证数据写⼊⽂件
	fflush(fp);
	//要读取数据b字符，先定位⽂件指针
	fseek(fp, 1, SEEK_SET);
	int ch = fgetc(fp);//读取字符
	printf("%c\n", ch);
	//在b的位置开始写⼊hello
	fseek(fp, -1, SEEK_CUR);
	//解释：因为前⾯读取⼀个字符后,⽂件指⽰器现在指向了c,需要从当前位置退回⼀个字符
	fputs("hello", fp);
	//关闭⽂件
	fclose(fp);
	fp = NULL;
	return 0;
}
